#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#include <unistd.h>

#include <sys/wait.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include <semaphore.h>
#include <sys/ipc.h>

#include <mysql/mysql.h>

#include <libxml2/libxml/parser.h>
#include <libxml2/libxml/tree.h>
#include <libxml2/libxml/xpath.h>

#ifndef AUTODUE_H
#define AUTODUE_H

// Dimensione predefinita per gli array di char
#define BUFF_SIZE	512
// Dimensione predefinita per le righe del file autodue.log
#define LOG_SIZE	4096

// Stringa di default per i messaggi di errore
#define ERROR_STRING "\nERRORE: %s.\n"

// Vengono impostati tutti gli xpath utilizzati nel programma
#define XPATH_SQL				"/autodue/sql"
#define XPATH_HOST				"/autodue/sql/host"
#define XPATH_PORT				"/autodue/sql/port"
#define XPATH_USERNAME			"/autodue/sql/username"
#define XPATH_PASSWORD			"/autodue/sql/password"

#define XPATH_DB				"/autodue/sql/db"
#define XPATH_DBNAME			"/autodue/sql/db[position()=%d]/@name"
#define XPATH_GRAPH				"/autodue/sql/db[position()=%d]/graph"
#define XPATH_NODES_TABLE		"/autodue/sql/db[position()=%d]/graph[position()=%d]/nodestable/@name"
#define XPATH_NODES_GRAPHID		"/autodue/sql/db[position()=%d]/graph[position()=%d]/nodestable/graphid"
#define XPATH_NODES_ID			"/autodue/sql/db[position()=%d]/graph[position()=%d]/nodestable/id"
#define XPATH_NODES_LBL			"/autodue/sql/db[position()=%d]/graph[position()=%d]/nodestable/label"
#define XPATH_GRAPH_ATTRIBUTES	"/autodue/sql/db[position()=%d]/graph[position()=%d]/nodestable/attribute"
#define XPATH_EDGES_TABLE		"/autodue/sql/db[position()=%d]/graph[position()=%d]/edgestable/@name"
#define XPATH_EDGES_GRAPHID		"/autodue/sql/db[position()=%d]/graph[position()=%d]/edgestable/graphid"
#define XPATH_EDGES_SRC			"/autodue/sql/db[position()=%d]/graph[position()=%d]/edgestable/sourcenode"
#define XPATH_EDGES_DEST		"/autodue/sql/db[position()=%d]/graph[position()=%d]/edgestable/destnode"
#define XPATH_EDGES_LBL			"/autodue/sql/db[position()=%d]/graph[position()=%d]/edgestable/label"
#define XPATH_EDGES_DIR			"/autodue/sql/db[position()=%d]/graph[position()=%d]/edgestable/direction"

#define XPATH_SD_BP				"/autodue/subdue/bindir"
#define XPATH_PREFIX			"/autodue/subdue/prefix"
#define XPATH_FILE_G			"/autodue/subdue/graphname"
#define XPATH_NTHREADS			"/autodue/subdue/nthreads"
#define XPATH_IMG_EXT			"/autodue/subdue/img"

#define XPATH_EXP				"/autodue/subdue/exp"
#define XPATH_ITERATIONS		"/autodue/subdue/exp[position()=%d]/iterations"
#define XPATH_BEAM				"/autodue/subdue/exp[position()=%d]/beam"
#define XPATH_BEAM_VAL			"/autodue/subdue/exp[position()=%d]/beam/value"
#define XPATH_PARAMETERS		"/autodue/subdue/exp[position()=%d]/parameters"
#define XPATH_COV				"/autodue/subdue/exp[position()=%d]/measures/cov"
#define XPATH_DIV				"/autodue/subdue/exp[position()=%d]/measures/div"
#define XPATH_REP				"/autodue/subdue/exp[position()=%d]/measures/rep"
#define XPATH_VER				"/autodue/subdue/exp[position()=%d]/measures/verbose"
#define XPATH_KEEP				"/autodue/subdue/exp[position()=%d]/measures/keepfiles"

char *filename_xml;
xmlDocPtr doc_xml;

// Funzione utilizzata per eseguire la funzione qsort()
int compare(const void *a, const void *b);

//Questa funzione esegue il parsing del documento xml passato come parametro
xmlDocPtr getdoc(char *docname);

// Questa funzione restituisce un puntatore al set di nodi presenti nel documento doc
// e corrispondenti all' xpath passato come parametro
xmlXPathObjectPtr getnodeset (xmlDocPtr doc, xmlChar *xpath);

// Questa funzione restituisce una stringa corrispondente al contenuto della prima occorrenza
// della tag specificata dall'xpath passato come parametro e presente nel documento doc_xml
xmlChar* getfirstvalue(xmlDocPtr doc_xml, xmlChar* xpath);

// Questa funzione restituisce una stringa corrispondente al contenuto della i-esima occorrenza
// della tag specificata dall'xpath passato come parametro e presente nel documento doc_xml
xmlChar* getonevalue(xmlDocPtr doc_xml, xmlChar* xpath, int index);

// Questa funzione restituisce il numero di occorenze della tag specificata dall'xpath
// nel documento doc_xml
int tagcount(xmlDocPtr doc_xml, xmlChar* xpath);

#endif
